package ThinkInJava;
/**
 * 初始化的先后顺序，首先是静态的数据成员，然后是静态代码块（后来验证是数据成员在前就先执行数据，否则就是静态代码块），
 * 但是对于静态方法，则无论静态数据成员在其之前还是之后都是先执行数据成员的初始化
 * 静态方法仅在有人调用的时候才执行，而一旦有人调用了类中的某个静态的
 * 数据成员或者方法成员，虽然此时并没有创建对象（既不会调用构造块方法和构造方法），但是会调用静态的代码块和数据
 * main方法执行是因为JVM调用了，但是数据以及静态代码块会在main（因为是静态方法）之前执行
 * 在实例化的时候采用初始化非静态的全局变量，然后是构造块，最后是构造方法
 * 在创建对象的时候，父类的静态数据和静态代码块（按照申明顺序，同一等级）-->子类的静态数据和静态代码块-->
 * 父类 普通成员变量 和父类构造块方法（按照申明顺序，同一等级） --> 父类构造函数-->
 * 子类成员变量和构造块方法（按照申明顺序，同一等级）-->子类构造函数
 * @author Administrator
 */
class A{
//	public static B b=new B();  //最先执行
	public  B b1=new B();  //在静态代码块执行之后执行  但在构造块方法之前
	public static A Bout(){
		System.out.println("that is A static method");
		return new A();
	}
	//构造块方法
	{
		System.out.println("that is A constact method");
	}
	static{
		System.out.println("that is just a A static method");
	}
//	private static C c1=new C();
	public A() {
		System.out.println("that is A constractor");
	}
}
class B{
	//private static A a=new A();
	//由于没有调用该方法，虽然静态方法已经加载完毕，但是并不会看到输出
	public static void Bout(){
		System.out.println("that is B static method");
	}
	//先执行构造块方法
	{
		System.out.println("that is B constract method");
	}
	public B() {
		System.out.println("that is B constractor");
	}
}
class C {
	//调用静态方法
	
	//由于没有调用该方法，虽然静态方法已经加载完毕，但是并不会看到输出
	//上面的那句话是错的，不是静态方法加载完毕，而是根本就没有加载
	//因为没有调用方法，故不会初始化
	static{
		//a.Bout();   这个会报错
		System.out.println("that is C static kuai method");
	}
	public static void Bmmmm(){
		//a.Bout();    这个则不会
		System.out.println("that is C static method");
	}
	private static A a=new A();
	public static void Cmmmm(){
		System.out.println("that is C static method");
	}
	//先执行构造块方法
	{
		System.out.println("that is C constract method");
	}
	public C() {
		System.out.println("that is C constractor");
	}
	private static A a1=new A();
}
public class OrderOfInit {

	//执行static的顺序是首先初始化变量，然后再执行方法
	//private static B b=new B();
//	private A a=new A();
//	private B b=new B();
//	private static C c=new C();
	static{
		C.Bmmmm();
	}
	public static void main(String[] args) {
		//static B b1=new B();  //静态变量不能用于局部变量
		//Polymorphism p=new Polymorphism();
		//即使没有显示的声明对象，但由于main是static方法，仍然会先执行父类的静态变量或方法
        System.out.println("that is aSub static method ");
	}
	//调用静态变量或者方法前会先调用父类的静态代码块或数据成员(没有非静态数据成员)，如果有的话。注意此时并没有创建父类
	//但是若新建一个类的对象，也会创建该类的父类对象
	//非静态变量如果不在静态方法中使用，则不会调用
    //全局变量的调用与其是否散布于不同地方没有关系，只会按照声明的顺序调用
	//private static C c=new C();
}
//输出为
//that is A constact method
//that is A constractor
//that is B constact method
//that is B constractor

//最后输出：
//that is B constact method
//that is B constractor
//that is aSub static method 
